package pe.com.bbva.modpre.persistencia.hibernate;

import java.math.BigDecimal;
import java.util.List;
import java.util.Map;

import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;

import pe.com.bbva.modpre.dominio.Equipo;
import pe.com.bbva.modpre.dominio.Usuario;
import pe.com.bbva.modpre.persistencia.UsuarioDAO;

@Repository
@SuppressWarnings("serial")
public class UsuarioHibernate extends BaseHibernate<Usuario, Long> 
		implements UsuarioDAO{

	@Value("${jdbc.schema}")
	private String schema;

	@Autowired
	private JdbcTemplate jdbcTemplate;
	
	public String obtenerObjetoBBDD(String objetoBBDD) {
		return schema+"."+objetoBBDD;
	}
	
	@Autowired
	public UsuarioHibernate(SessionFactory sessionFactory) {
		setSessionFactory(sessionFactory);
	}

	@Override
	public Usuario obtenerUsuarioxRegistro(String registro) {
		return obtenerHql("select u from Usuario u where u.registro=?", registro);
	}

	@Override
	public List<Usuario> obtenerUsuariosxEquipo(Equipo equipo) {
		return buscarHql("select i.usuario from Integrante i where i.equipo.id=?", equipo.getId());
	}
	
	@Override
	public List<Usuario> obtenerUsuariosAnalistas() {
		return buscarHql("select i.usuario from Integrante i where i.equipo.codigo='ANA_PRE_MIN' or i.equipo.codigo='ANA_PRE_BEC'");
	}
	
	
	@Override
	public Usuario obtenerUsuarioxDistribucion(String codigoEquipo) {
		
		StringBuilder sql=new StringBuilder();
		sql.append("select i.usuario, nvl(t.cantidad,0) cantidad from "+obtenerObjetoBBDD("org_integrante i "));
		sql.append("inner join "+obtenerObjetoBBDD("org_equipo e ")+"on i.equipo=e.id ");
		sql.append("left join "+obtenerObjetoBBDD("cfg_disponibilidad d ")+"on i.usuario=d.usuario and sysdate between d.fecha_desde and d.fecha_hasta ");
		sql.append("left join ");
		sql.append("(select t.usuario, count(*) cantidad from ");
		sql.append("(select o.solicitud, i.usuario from "+obtenerObjetoBBDD("sol_operacion o "));
		sql.append("inner join "+obtenerObjetoBBDD("org_integrante i ")+"on o.responsable=i.usuario ");
		sql.append("inner join "+obtenerObjetoBBDD("org_equipo e ")+"on i.equipo=e.id ");
		sql.append("where e.codigo=? ");
		sql.append("group by o.solicitud,i.usuario) ");
		sql.append("t group by usuario) t on i.usuario=t.usuario ");
		sql.append("where e.codigo=? and d.usuario is null order by cantidad ");
		
		List<Map<String, Object>> rows = jdbcTemplate.queryForList(sql.toString(), codigoEquipo, codigoEquipo);
		
		Usuario usuario=obtener(((BigDecimal)rows.get(0).get("usuario")).longValue());
		
		return usuario;
	}
		
}
